#!/bin/sh /etc/rc.common
# Copyright (C) 2020 IrineSistiana
# shellcheck disable=SC2034

START=99
USE_PROCD=1

#####  ONLY CHANGE THIS BLOCK  ######
PROG=/usr/bin/mosdns                        # where is mosdns
RES_DIR=/etc/mosdns/                        # resource dir / working dir / the dir where you store ip/domain lists
CONF=$(uci -q get mosdns.mosdns.configfile) # where is the config file, it can be a relative path to $RES_DIR
CRON_FILE=/etc/crontabs/root
#####  ONLY CHANGE THIS BLOCK  ######

inital_conf() {
	config_load "mosdns"
	config_get "enabled" "mosdns" "enabled" "0"
}
service_triggers() {
	procd_add_reload_trigger "mosdns"
}

restore_setting() {
	sed -i "/list server/d" /etc/config/dhcp
	uci set dhcp.@dnsmasq[0].noresolv='0'
	uci del dhcp.@dnsmasq[0].cachesize
	uci set dhcp.@dnsmasq[0].filter_aaaa='1'
	uci commit dhcp
}

prepare_setting() {
	redirect=$(uci -q get mosdns.mosdns.redirect)
	if [ "$redirect" -eq 1 ]; then
		sed -i "/list server/d" /etc/config/dhcp
		uci add_list dhcp.@dnsmasq[0].server='127.0.0.1#5335'
		uci set dhcp.@dnsmasq[0].rebind_protection='0'
		uci set dhcp.@dnsmasq[0].noresolv="1"
		uci set dhcp.@dnsmasq[0].cachesize='0'
		uci set dhcp.@dnsmasq[0].filter_aaaa='0'
		uci commit dhcp
	fi
}

restart_others() {
	/etc/init.d/network reload
	/etc/init.d/dnsmasq reload
}

reload_service() {
	stop
	sleep 2s
	echo "MosDNS is restarted!"
	start
}

setcron() {
	touch $CRON_FILE
	sed -i '/mosupdater.sh/d' $CRON_FILE 2>/dev/null && {
		[ "$(uci -q get mosdns.mosdns.geo_auto_update)" -eq 1 ] && echo "0 $(uci -q get mosdns.mosdns.geo_update_day_time) * * $(uci -q get mosdns.mosdns.geo_update_week_time) /etc/mosdns/mosupdater.sh" >>$CRON_FILE
	}
	crontab $CRON_FILE
}

delcron() {
	sed -i '/mosupdater.sh/d' $CRON_FILE 2>/dev/null
	/etc/init.d/cron restart
}

adblock() {
	cp -f /etc/mosdns/serverlist.txt /etc/mosdns/serverlist.bak
	modns_adblock=$(uci -q get mosdns.mosdns.adblock)
	if [ "$modns_adblock" = 0 ]; then
		: > /etc/mosdns/serverlist.txt
	else
		cat /etc/mosdns/serverlist.bak >/etc/mosdns/serverlist.txt
	fi
}

start_service() {

	# Reading config
	inital_conf
	if [ "$enabled" -eq 0 ]; then
		firstblood=$(uci -q get mosdns.mosdns.not_first_start)
		[ "${firstblood}" = "0" ] && restore_setting
		[ "${firstblood}" = "0" ] && restart_others
		uci set mosdns.mosdns.not_first_start='1'
		uci commit mosdns
		echo "MosDNS has turned off"
		return 1
	fi
	delcron
	setcron
	adblock
	sysctl -w net.core.rmem_max=2500000
	procd_open_instance mosdns
	procd_set_param command $PROG -dir $RES_DIR -c "$CONF"
	procd_set_param user root
	procd_set_param stdout 1
	procd_set_param stderr 1
	procd_set_param respawn "${respawn_threshold:-3600}" "${respawn_timeout:-5}" "${respawn_retry:-5}"
	procd_close_instance mosdns

	configfile=$(uci -q get mosdns.mosdns.configfile)
	if [ "${configfile}" = "./def_config.yaml" ]; then
		restore_setting
		prepare_setting
		if [ "$(uci -q get mosdns.mosdns.redirect)" -eq 1 ] && [ "$(uci -q get shadowsocksr.@global[0].run_mode)" != gfw ]; then
			cat /dev/null > /etc/ssrplus/gfw_list.conf
			sed -i '/update.lua/d' /usr/share/shadowsocksr/ssrplusupdate.sh
			sed -i '/bin\/sh/a\/usr/bin/lua /usr/share/shadowsocksr/update.lua ad_data' /usr/share/shadowsocksr/ssrplusupdate.sh
			sed -i '/bin\/sh/a\/usr/bin/lua /usr/share/shadowsocksr/update.lua nfip_data' /usr/share/shadowsocksr/ssrplusupdate.sh
			sed -i '/bin\/sh/a\/usr/bin/lua /usr/share/shadowsocksr/update.lua ip_data' /usr/share/shadowsocksr/ssrplusupdate.sh
		fi
		restart_others
	fi

	echo "MosDNS turn on"
	echo "enabled=$enabled"

}

stop_service() {

	pgrep -f /usr/bin/mosdns | xargs kill -9
	echo "MosDNS turn off"
	echo "enabled=$enabled"

	configfile=$(uci -q get mosdns.mosdns.configfile)
	if [ "${configfile}" = "./def_config.yaml" ]; then
		config_load "mosdns"
		enabled=$(uci -q get mosdns.mosdns.enabled)
		[ "${enabled}" = "0" ] && restore_setting
		restart_others
	fi
	delcron

}
